from time import sleep
from hash.Hash import Hash
class CommonHash(Hash):
    """
    普通的Hash算法，基于求余的方式实现，但是Hash表的长度可以改变
    """
    def __init__(self, length):
        super().__init__()
        self.length=length
        self.keys.extend(None for i in range(length))# 初始化空间

    def set(self,key,value):
        """
        :param key:
        :param value:
        :return: 写入结点的位置
        """
        super().set(key,value)
        length=len(self.node_list)
        # 使用MD5算法对key进行加密，并将加密后的结果转换为16进制后再转为int类型数据
        hash_value=self._hash(key)
        # 将hash_value对length取余，得到的结果就是key在Hash表中的位置
        index=hash_value%length
        target_node=self.node_list[index]
        target_node.set(key,value) # 写入数据
        return target_node

    def get(self,key):
        """
        根据key值获取对应的value值，并且将value所在结点信息返回
        :param key:
        :return: (node,value)
        """
        super().get(key)
        length=len(self.node_list)
        hash_value=self._hash(key)
        index=hash_value%length
        target_node=self.node_list[index] # 获取结点所在的服务器
        node,value=target_node.get(key) # 获取value
        if value is not None:
            # 此时Hash命中
            self.hit_number+=1
        else:
            # hash没有命中的时候，需要访问其他结点的数据，
            # 在服务器里面找到对应的key值，根据key值获取对应的value值，模拟一次数据迁移
            # 由于普通的Hash算法没有考虑到这一点，而实际环境下当Cache不命中时应当访问专门服务器内存，获取数据，更新缓存
            pass
        return node,value

    # def add_node(self, node, index):
    #     super().add_node(node,index)
    #     self.length+=1
    #
    # def remove_node(self, node):
    #     super().remove_node(node)
    #     self.length-=1
    #     return node



